package com.hantsylabs.example.spring.faces;
import com.hantsylabs.example.spring.web.TaskNotFoundException;
import com.sun.faces.context.FacesFileNotFoundException;
import java.util.Iterator;
import javax.faces.FacesException;
import javax.faces.application.NavigationHandler;
import javax.faces.application.ViewExpiredException;
import javax.faces.context.ExceptionHandler;
import javax.faces.context.ExceptionHandlerWrapper;
import javax.faces.context.FacesContext;
import javax.faces.event.ExceptionQueuedEvent;
import javax.faces.event.ExceptionQueuedEventContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class DefaultExceptionHandler extends ExceptionHandlerWrapper {
private static final Logger log = LoggerFactory.getLogger(DefaultExceptionHandler.class);
private ExceptionHandler wrapped;
public DefaultExceptionHandler(ExceptionHandler wrapped) {
this.wrapped = wrapped;
}
@Override
public ExceptionHandler getWrapped() {
return this.wrapped;
}
@Override
public void handle() throws FacesException {
log.debug("invoking custom ExceptionHandlder...");
Iterator<ExceptionQueuedEvent> events = getUnhandledExceptionQueuedEvents().iterator();
while (events.hasNext()) {
ExceptionQueuedEvent event = events.next();
ExceptionQueuedEventContext context = (ExceptionQueuedEventContext) event.getSource();
Throwable t = context.getException();
log.debug("Exception@" + t);
log.debug("ExceptionHandlder began.");
log.debug("t instanceof FacesException@" + (t instanceof FacesException));
log.debug("t instanceof FacesFileNotFoundException@" + (t instanceof FacesFileNotFoundException));
if (t instanceof ViewExpiredException) {
try {
handleViewExpiredException((ViewExpiredException) t);
} finally {
events.remove();
}
}
if (t instanceof FacesFileNotFoundException|| t instanceof TaskNotFoundException) {
try {
handleNotFoundException((Exception) t);
} finally {
events.remove();
}
}
log.debug("ExceptionHandlder end.");
getWrapped().handle();
}
}
private void handleViewExpiredException(ViewExpiredException vee) {
log.debug(" handling viewExpiredException...");
FacesContext context = FacesContext.getCurrentInstance();
String viewId = vee.getViewId();
log.debug("view id @" + viewId);
NavigationHandler nav =
context.getApplication().getNavigationHandler();
nav.handleNavigation(context, null, viewId);
context.renderResponse();
}
private void handleNotFoundException(Exception e) {
log.debug("handling exception:...");
FacesContext context = FacesContext.getCurrentInstance();
String viewId = "/error.xhtml";
log.debug("view id @" + viewId);
NavigationHandler nav =
context.getApplication().getNavigationHandler();
nav.handleNavigation(context, null, viewId);
context.getViewRoot().getViewMap(true).put("ex", e);
context.renderResponse();
}
}